#:  -*- coding: utf-8 -*-
import time
import traceback

from chanlun import fun
from chanlun.cl_interface import *
from chanlun.exchange.exchange_tdx import ExchangeTDX
from chanlun.strategy.strategy_xd_mmd import StrategyXDMMD
from chanlun.trader.online_market_datas import OnlineMarketDatas
from chanlun.trader.trader_a_stock import TraderAStock

"""
运行依赖 futuOpenD
"""

logger = fun.get_logger("trader_a_stock.log")

logger.info("沪深自动化交易程序")

try:
    run_codes = [
        "SZ.000001",
        "SZ.000002",
        "SZ.000009",
        "SZ.000027",
        "SZ.000039",
        "SZ.000050",
        "SZ.000063",
        "SZ.000066",
        "SZ.000069",
        "SZ.000100",
        "SZ.000155",
        "SZ.000157",
        "SZ.000166",
        "SZ.000301",
        "SZ.000333",
        "SZ.000338",
        "SZ.000401",
        "SZ.000425",
        "SZ.000513",
        "SZ.000519",
        "SZ.000537",
        "SZ.000538",
        "SZ.000539",
        "SZ.000553",
        "SZ.000568",
        "SZ.000581",
        "SZ.000591",
        "SZ.000596",
        "SZ.000617",
        "SZ.000625",
        "SZ.000629",
        "SZ.000630",
        "SZ.000651",
        "SZ.000656",
        "SZ.000661",
        "SZ.000683",
        "SZ.000703",
        "SZ.000708",
        "SZ.000709",
        "SZ.000723",
        "SZ.000725",
        "SZ.000728",
        "SZ.000733",
        "SZ.000738",
        "SZ.000739",
        "SZ.000768",
        "SZ.000776",
        "SZ.000783",
        "SZ.000785",
        "SZ.000786",
        "SZ.000792",
        "SZ.000799",
        "SZ.000800",
        "SZ.000807",
        "SZ.000825",
        "SZ.000830",
        "SZ.000831",
        "SZ.000858",
        "SZ.000876",
        "SZ.000877",
        "SZ.000883",
        "SZ.000893",
        "SZ.000895",
        "SZ.000898",
        "SZ.000902",
        "SZ.000932",
        "SZ.000933",
        "SZ.000937",
        "SZ.000938",
        "SZ.000958",
        "SZ.000959",
        "SZ.000960",
        "SZ.000963",
        "SZ.000975",
        "SZ.000977",
        "SZ.000983",
        "SZ.000987",
        "SZ.000998",
        "SZ.000999",
        "SZ.001965",
        "SZ.001979",
        "SZ.002001",
        "SZ.002007",
        "SZ.002008",
        "SZ.002013",
        "SZ.002015",
        "SZ.002024",
        "SZ.002025",
        "SZ.002027",
        "SZ.002028",
        "SZ.002030",
        "SZ.002032",
        "SZ.002049",
        "SZ.002050",
        "SZ.002056",
        "SZ.002064",
        "SZ.002074",
        "SZ.002078",
        "SZ.002080",
        "SZ.002120",
        "SZ.002128",
        "SZ.002129",
        "SZ.002138",
        "SZ.002142",
        "SZ.002152",
        "SZ.002153",
        "SZ.002176",
        "SZ.002179",
        "SZ.002180",
        "SZ.002185",
        "SZ.002192",
        "SZ.002202",
        "SZ.002223",
        "SZ.002230",
        "SZ.002236",
        "SZ.002240",
        "SZ.002241",
        "SZ.002244",
        "SZ.002252",
        "SZ.002266",
        "SZ.002268",
        "SZ.002271",
        "SZ.002294",
        "SZ.002299",
        "SZ.002304",
        "SZ.002311",
        "SZ.002326",
        "SZ.002340",
        "SZ.002352",
        "SZ.002353",
        "SZ.002371",
        "SZ.002372",
        "SZ.002384",
        "SZ.002385",
        "SZ.002405",
        "SZ.002407",
        "SZ.002408",
        "SZ.002409",
        "SZ.002410",
        "SZ.002414",
        "SZ.002415",
        "SZ.002422",
        "SZ.002430",
        "SZ.002459",
        "SZ.002460",
        "SZ.002463",
        "SZ.002465",
        "SZ.002466",
        "SZ.002475",
        "SZ.002493",
        "SZ.002497",
        "SZ.002507",
        "SZ.002508",
        "SZ.002532",
        "SZ.002555",
        "SZ.002557",
        "SZ.002568",
        "SZ.002594",
        "SZ.002597",
        "SZ.002600",
        "SZ.002601",
        "SZ.002602",
        "SZ.002603",
        "SZ.002607",
        "SZ.002624",
        "SZ.002625",
        "SZ.002648",
        "SZ.002673",
        "SZ.002709",
        "SZ.002714",
        "SZ.002736",
        "SZ.002738",
        "SZ.002756",
        "SZ.002791",
        "SZ.002797",
        "SZ.002812",
        "SZ.002821",
        "SZ.002831",
        "SZ.002841",
        "SZ.002850",
        "SZ.002916",
        "SZ.002920",
        "SZ.002936",
        "SZ.002938",
        "SZ.002939",
        "SZ.002945",
        "SZ.002948",
        "SZ.002966",
        "SZ.003022",
        "SZ.003035",
        "SZ.003816",
        "SZ.300012",
        "SZ.300014",
        "SZ.300015",
        "SZ.300033",
        "SZ.300037",
        "SZ.300059",
        "SZ.300073",
        "SZ.300122",
        "SZ.300142",
        "SZ.300144",
        "SZ.300146",
        "SZ.300171",
        "SZ.300207",
        "SZ.300223",
        "SZ.300251",
        "SZ.300274",
        "SZ.300285",
        "SZ.300308",
        "SZ.300316",
        "SZ.300347",
        "SZ.300357",
        "SZ.300363",
        "SZ.300373",
        "SZ.300390",
        "SZ.300413",
        "SZ.300450",
        "SZ.300454",
        "SZ.300496",
        "SZ.300529",
        "SZ.300568",
        "SZ.300595",
        "SZ.300601",
        "SZ.300628",
        "SZ.300661",
        "SZ.300676",
        "SZ.300682",
        "SZ.300699",
        "SZ.300726",
        "SZ.300759",
        "SZ.300760",
        "SZ.300763",
        "SZ.300769",
        "SZ.300776",
        "SZ.300777",
        "SZ.300782",
        "SZ.300832",
        "SZ.300850",
        "SZ.300861",
        "SZ.300888",
        "SZ.300896",
        "SZ.300919",
        "SZ.300957",
        "SZ.300979",
        "SH.600000",
        "SH.600004",
        "SH.600008",
        "SH.600009",
        "SH.600010",
        "SH.600011",
        "SH.600015",
        "SH.600016",
        "SH.600018",
        "SH.600019",
        "SH.600021",
        "SH.600025",
        "SH.600026",
        "SH.600027",
        "SH.600028",
        "SH.600029",
        "SH.600030",
        "SH.600031",
        "SH.600036",
        "SH.600038",
        "SH.600039",
        "SH.600048",
        "SH.600050",
        "SH.600056",
        "SH.600061",
        "SH.600062",
        "SH.600079",
        "SH.600085",
        "SH.600089",
        "SH.600104",
        "SH.600109",
        "SH.600111",
        "SH.600115",
        "SH.600118",
        "SH.600132",
        "SH.600141",
        "SH.600143",
        "SH.600150",
        "SH.600153",
        "SH.600160",
        "SH.600161",
        "SH.600170",
        "SH.600176",
        "SH.600177",
        "SH.600183",
        "SH.600188",
        "SH.600196",
        "SH.600208",
        "SH.600219",
        "SH.600233",
        "SH.600236",
        "SH.600248",
        "SH.600256",
        "SH.600258",
        "SH.600276",
        "SH.600282",
        "SH.600295",
        "SH.600298",
        "SH.600299",
        "SH.600309",
        "SH.600315",
        "SH.600332",
        "SH.600346",
        "SH.600348",
        "SH.600350",
        "SH.600352",
        "SH.600362",
        "SH.600369",
        "SH.600372",
        "SH.600377",
        "SH.600378",
        "SH.600380",
        "SH.600383",
        "SH.600392",
        "SH.600398",
        "SH.600406",
        "SH.600415",
        "SH.600426",
        "SH.600436",
        "SH.600438",
        "SH.600456",
        "SH.600460",
        "SH.600483",
        "SH.600486",
        "SH.600487",
        "SH.600489",
        "SH.600499",
        "SH.600511",
        "SH.600516",
        "SH.600519",
        "SH.600521",
        "SH.600522",
        "SH.600547",
        "SH.600548",
        "SH.600549",
        "SH.600563",
        "SH.600566",
        "SH.600570",
        "SH.600584",
        "SH.600585",
        "SH.600588",
        "SH.600598",
        "SH.600600",
        "SH.600606",
        "SH.600612",
        "SH.600637",
        "SH.600642",
        "SH.600655",
        "SH.600660",
        "SH.600663",
        "SH.600674",
        "SH.600688",
        "SH.600690",
        "SH.600702",
        "SH.600703",
        "SH.600704",
        "SH.600705",
        "SH.600739",
        "SH.600741",
        "SH.600745",
        "SH.600754",
        "SH.600760",
        "SH.600763",
        "SH.600765",
        "SH.600779",
        "SH.600795",
        "SH.600801",
        "SH.600803",
        "SH.600808",
        "SH.600809",
        "SH.600837",
        "SH.600845",
        "SH.600848",
        "SH.600859",
        "SH.600862",
        "SH.600863",
        "SH.600867",
        "SH.600871",
        "SH.600873",
        "SH.600875",
        "SH.600884",
        "SH.600885",
        "SH.600886",
        "SH.600887",
        "SH.600893",
        "SH.600900",
        "SH.600905",
        "SH.600909",
        "SH.600918",
        "SH.600919",
        "SH.600926",
        "SH.600956",
        "SH.600958",
        "SH.600968",
        "SH.600985",
        "SH.600988",
        "SH.600989",
        "SH.600998",
        "SH.600999",
        "SH.601001",
        "SH.601006",
        "SH.601009",
        "SH.601012",
        "SH.601016",
        "SH.601018",
        "SH.601021",
        "SH.601058",
        "SH.601066",
        "SH.601077",
        "SH.601088",
        "SH.601100",
        "SH.601108",
        "SH.601111",
        "SH.601117",
        "SH.601128",
        "SH.601138",
        "SH.601155",
        "SH.601156",
        "SH.601158",
        "SH.601162",
        "SH.601166",
        "SH.601168",
        "SH.601169",
        "SH.601186",
        "SH.601198",
        "SH.601211",
        "SH.601216",
        "SH.601225",
        "SH.601229",
        "SH.601231",
        "SH.601233",
        "SH.601236",
        "SH.601238",
        "SH.601288",
        "SH.601298",
        "SH.601318",
        "SH.601319",
        "SH.601328",
        "SH.601336",
        "SH.601360",
        "SH.601377",
        "SH.601390",
        "SH.601398",
        "SH.601456",
        "SH.601555",
        "SH.601577",
        "SH.601598",
        "SH.601600",
        "SH.601601",
        "SH.601607",
        "SH.601615",
        "SH.601618",
        "SH.601628",
        "SH.601633",
        "SH.601636",
        "SH.601658",
        "SH.601665",
        "SH.601666",
        "SH.601668",
        "SH.601669",
        "SH.601677",
        "SH.601688",
        "SH.601689",
        "SH.601696",
        "SH.601699",
        "SH.601717",
        "SH.601727",
        "SH.601766",
        "SH.601788",
        "SH.601799",
        "SH.601800",
        "SH.601808",
        "SH.601816",
        "SH.601818",
        "SH.601828",
        "SH.601838",
        "SH.601857",
        "SH.601865",
        "SH.601866",
        "SH.601872",
        "SH.601877",
        "SH.601878",
        "SH.601880",
        "SH.601881",
        "SH.601888",
        "SH.601898",
        "SH.601899",
        "SH.601901",
        "SH.601916",
        "SH.601919",
        "SH.601933",
        "SH.601939",
        "SH.601958",
        "SH.601963",
        "SH.601966",
        "SH.601985",
        "SH.601988",
        "SH.601989",
        "SH.601990",
        "SH.601991",
        "SH.601992",
        "SH.601995",
        "SH.601997",
        "SH.601998",
        "SH.603019",
        "SH.603077",
        "SH.603087",
        "SH.603127",
        "SH.603160",
        "SH.603185",
        "SH.603195",
        "SH.603198",
        "SH.603229",
        "SH.603233",
        "SH.603236",
        "SH.603259",
        "SH.603260",
        "SH.603267",
        "SH.603288",
        "SH.603290",
        "SH.603345",
        "SH.603369",
        "SH.603392",
        "SH.603444",
        "SH.603456",
        "SH.603486",
        "SH.603501",
        "SH.603517",
        "SH.603565",
        "SH.603568",
        "SH.603589",
        "SH.603596",
        "SH.603605",
        "SH.603606",
        "SH.603613",
        "SH.603658",
        "SH.603659",
        "SH.603688",
        "SH.603707",
        "SH.603712",
        "SH.603737",
        "SH.603799",
        "SH.603806",
        "SH.603816",
        "SH.603833",
        "SH.603858",
        "SH.603868",
        "SH.603882",
        "SH.603885",
        "SH.603893",
        "SH.603899",
        "SH.603939",
        "SH.603986",
        "SH.603993",
        "SH.605117",
        "SH.605358",
        "SH.605499",
        "SH.688005",
        "SH.688008",
        "SH.688009",
        "SH.688012",
        "SH.688036",
        "SH.688099",
        "SH.688111",
        "SH.688116",
        "SH.688122",
        "SH.688126",
        "SH.688139",
        "SH.688169",
        "SH.688180",
        "SH.688185",
        "SH.688188",
        "SH.688202",
        "SH.688298",
        "SH.688301",
        "SH.688363",
        "SH.688385",
        "SH.688396",
        "SH.688516",
        "SH.688536",
        "SH.688599",
        "SH.688690",
        "SH.688798",
        "SH.688981",
    ]

    logger.info("Run symbols:  %s" % run_codes)

    frequencys = ["d"]

    cl_config = {
        # 分型默认配置
        "fx_qj": Config.FX_QJ_K.value,
        "fx_bh": Config.FX_BH_YES.value,
        # 笔默认配置
        "bi_type": Config.BI_TYPE_NEW.value,
        "bi_bzh": Config.BI_BZH_YES.value,
        "bi_fx_cgd": Config.BI_FX_CHD_NO.value,
        "bi_qj": Config.BI_QJ_DD.value,
        # 线段默认配置
        "xd_bzh": Config.XD_BZH_NO.value,
        "xd_qj": Config.XD_QJ_DD.value,
        # 走势段默认配置
        "zsd_bzh": Config.ZSD_BZH_NO.value,
        "zsd_qj": Config.ZSD_QJ_DD.value,
        # 中枢默认配置
        "zs_bi_type": Config.ZS_TYPE_DN.value,  # 笔中枢类型
        "zs_xd_type": Config.ZS_TYPE_DN.value,  # 走势中枢类型
        "zs_qj": Config.ZS_QJ_CK.value,
        "zs_wzgx": Config.ZS_WZGX_ZGD.value,
    }

    code_cl_datas = {}

    p_redis_key = "trader_a_stock"

    # 交易所对象
    ex = ExchangeTDX()
    # 交易对象
    TR = TraderAStock("AStock", log=logger.info)
    # 行情数据对象
    Data = OnlineMarketDatas("a", frequencys, ex, cl_config)
    # 从 redis 中加载数据
    TR.load_from_pkl(p_redis_key)
    # 策略
    STR = StrategyXDMMD()
    # 将策略与数据对象加入到交易对象中
    TR.set_strategy(STR)
    TR.set_data(Data)

    while True:
        try:
            seconds = int(time.time())

            if seconds % (30 * 60) != 0:
                time.sleep(1)
                continue

            # 判断是否是交易时间
            if ex.now_trading() is False:
                continue

            # 增加当前持仓中的交易对儿
            run_codes = TR.position_codes() + run_codes
            run_codes = list(set(run_codes))

            for code in run_codes:
                try:
                    TR.run(code)
                except Exception as e:
                    logger.error(traceback.format_exc())

            # 清空之前获取的k线缓存，避免后续无法获取最新数据
            Data.clear_cache()

            # 保存交易数据到 Redis 中
            TR.save_to_pkl(p_redis_key)

        except Exception as e:
            logger.error(traceback.format_exc())

except Exception as e:
    logger.error(traceback.format_exc())
finally:
    logger.info("Done")
